通信障害とGoogle Play Store App
概要
Androidで通信状況がアレなときに、
Platformの用意したサーバと連絡がとれないくせに購入できたことにするGoogleさんのPlayStoreAppの仕様最高にロックだぞみたいな事案にあたった。
きっと悪い夢だ。俺の使ってるプラグインとかコードのバグに違いない。
内容
以下のような手順で発生する。
・StoreAppの通信失敗が原因での失敗なのにUser Cancelled扱いにする
・そのくせ課金は済んでるのでどっかのタイミングでinventoryに購入済み状態でレシートが現れる
みたいなの闇で楽しい。
UnityでAndroidのやつ作ってて見つけた挙動なので、Prime31とかのプラグインがUser Cancelled を返してるのかも知れないので、
追う。
メモ for https://www.websequencediagrams.com
client ->+ playStoreApp: start purchase
playStoreApp ->+ google: start purchase
note right of google
ここで、ユーザーが購入可否を提案され、
購入しますか? ハイ を押した瞬間に端末をオフラインにすると、
clientがplayStoreAppから受け取る返答は
User Cancelled (-1005) になり、
さらにplayStoreAppには「購入済み」状態でチケットが発生、
その後のclient内でのqueryInventoryとかでの取得で
「購入済み」状態で確認できる。
つまりこれ、課金はされてるのでは?
オフラインになって通信失敗したのにUser Cancelledにしたり
課金されたりでうん???っていう気持ち。
clientとplayStoreAppの間をプラグインで実現してるんで、
その間でUser Cancelledはコードのミスとかで
発生しているかもしれないが、
チケットが発生するのはどうなのこれ。
end note
google-->-playStoreApp: ???
note right of playStoreApp
課金チケット爆誕、
以降適当なタイミングで
inventoryに現れるようになり、
その状態は0 = purchased
end note
playStoreApp-->-client: User Cancelled
note left of client
えっ
キャンセルなんかしてねーし
end note